#include<iostream>
#include<string>
#include<time.h>

using namespace std;

int main() {
    int M;
    cout << "Введите размер матрицы в пределах [2,5]:\n";
    cin >> M;
    bool error;
    error = cin.fail() || (M < 2 || M > 5);
    while(error) {
        if(cin.fail()) {
            cout << "Неверный ввод. Введите число:\n";
            cin.clear();
            cin.ignore(32767, '\n');
            cin >> M;
        }
        if(M < 2 || M > 5) {
            cout << "Вы ввели неверный размер, введите снова:\n";
            cin >> M;
        }
        error = cin.fail() || (M < 2 || M > 5);
    }
    string words[M][M];
    // Генерация матрицы слов
    srand(time(NULL));
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < M; j++) {
            words[i][j] += (char)(rand() % 26 + 65);
            for(int k = 1; k < 4; k++) {
                words[i][j] += (char)(rand() % 26 + 97);
            } 
        }
    }
    cout << "Сгенерированная матрица:\n";
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < M; j++) {
            cout << words[i][j] << ' ';
        }
        cout << endl;
    }
    // Удаление гласных букв в матрице
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < M; j++) {
            int k = 0;
            while(k < words[i][j].size()) {
                if(words[i][j][k] == 'a' || words[i][j][k] == 'A' ||
                   words[i][j][k] == 'e' || words[i][j][k] == 'E' ||
                   words[i][j][k] == 'u' || words[i][j][k] == 'U' ||
                   words[i][j][k] == 'o' || words[i][j][k] == 'O' ||
                   words[i][j][k] == 'i' || words[i][j][k] == 'I') {
                    words[i][j].erase(words[i][j].begin() + k);
                    k = 0;
                } else {
                    k++;
                }
            }
        }
    }
    cout << "\nОбработанная матрица:\n";
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < M; j++) {
            cout << words[i][j] << ' ';
        }
        cout << endl;
    }
    // Массив размеров слов в обработанной матрице с сортировкой
    int count[M*M];
    for(int j = 0; j < M; j++) {
        for(int i = 0; i < M; i++) {
            count[j*M + i] = words[i][j].size();
        }
    }
    for(int i = 0; i < M*M - 1; i++) {
        for(int j = i + 1; j < M*M; j++)
        if(count[i] < count[j]) {
            int buf = count[i];
            count[i] = count[j];
            count[j] = buf;
        }
    }
    cout << "\nОтсортированный массив размеров обработанных слов:\n";
    for(int i = 0; i < M*M; i++) {
        cout << count[i] << ' ';
    }
    cout << endl;

    return 0;
}

